Add hey setup omarchy and the bar unread indicator - #225
Conversation
There was a problem hiding this comment.
Pull request overview
Adds Omarchy desktop integration, unread bar status, theme support, documentation, and tests.
Changes:
- Adds idempotent Omarchy setup/removal steps.
- Adds the hidden unread Imbox bar command.
- Documents the integration and updates command discovery.
Tip
If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or run gh pr ready --undo.
Click "Ready for review" or run gh pr ready to reengage.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
.surface |
Lists Omarchy setup commands. |
README.md |
Adds Omarchy setup instructions. |
docs/omarchy.md |
Records integration design and behavior. |
internal/cmd/accounts_test.go |
Tests account-scope exemption. |
internal/cmd/omarchy.go |
Implements setup, removal, and bar status. |
internal/cmd/omarchy/hey.toml.tpl |
Defines the theme template. |
internal/cmd/omarchy_test.go |
Tests setup and unread status behavior. |
internal/cmd/root.go |
Registers and scopes the Omarchy command. |
internal/cmd/setup.go |
Registers the setup subcommand. |
Suppressed comments (1)
internal/cmd/omarchy.go:456
--removeunconditionally deletes the user template, so any customization made to the installed file (or a template that predated setup) is lost. Removal should only delete content demonstrably owned and unchanged by hey-cli; otherwise preserve it and report that it was left in place.
changed, err := removeFileIfPresent(path)
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6bb9f72333
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b802b10d27
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
a9267f4 to
cf38ec5
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cf38ec578c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d97c920257
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
2c92366 to
f43ce49
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f43ce49a5f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: de5efeb287
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 76d5886a43
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f0e5b9c8b0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9734a8343e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 116ae392fc
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3bb36eb4cf
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
hey setup omarchy installs hey-cli into the Omarchy desktop: a HEY TUI launcher entry under app-id org.omarchy.hey, a HEY row in the SUPER+SPACE menu, an inline hey-unread command module on the bar, and a hey.toml.tpl theme template so theme authors can tune the TUI's accent overlay. Every step is idempotent, reported separately, and --remove reverses them all. The keybinding is printed, never written -- bindings.lua stays the user's. hey omarchy bar-status (hidden) is what the bar module runs every three minutes: a Waybar-style JSON object when the Imbox has unread mail and nothing otherwise. An indicator, not a count -- a number is the attention treadmill HEY exists to end. Logged out or offline also prints nothing and exits 0, because a bar is no place for an error message. Every surface -- launcher, menu row, bar click, suggested keybinding -- shares one app-id so they all focus the same window.
README gains an Omarchy section (theming is zero-setup; yay -S hey-cli; hey setup omarchy) and docs/omarchy.md records the full design: the accent and selection gates with their thresholds, the foot fresh-window caveat, the atomic-mv watch, the decisions (indicator not count, overlay not hex port, complement the shipped web app), follow-ups in order, and the anti-features so they stay anti.
- baselineSkillInstalled requires the ownership marker as well as a regular file — the final presence predicate aligned with the rules every write path enforces, so an unmarked hand-authored baseline is refused by install AND never reported as a healthy installation. - The agent-local setup subcommands (and skill) enroll in #225's commandIgnoresLocalConfig path: they load the global config only, degrading to defaults, so a malformed repository .hey/config.json cannot stop the installer's setup agents handoff before the trust exemption is even consulted. Runtime-config commands still surface the parse error. - install.ps1 gets the same optional-setup guard install.sh got: a wizard that exits nonzero (declined OAuth, timeout, busy callback port) prints next steps instead of failing or silently swallowing a completed install, with $LASTEXITCODE checked because Windows PowerShell 5.1 does not throw on native nonzero exits.
- baselineSkillInstalled requires the ownership marker as well as a regular file — the final presence predicate aligned with the rules every write path enforces, so an unmarked hand-authored baseline is refused by install AND never reported as a healthy installation. - The agent-local setup subcommands (and skill) enroll in #225's commandIgnoresLocalConfig path: they load the global config only, degrading to defaults, so a malformed repository .hey/config.json cannot stop the installer's setup agents handoff before the trust exemption is even consulted. Runtime-config commands still surface the parse error. - install.ps1 gets the same optional-setup guard install.sh got: a wizard that exits nonzero (declined OAuth, timeout, busy callback port) prints next steps instead of failing or silently swallowing a completed install, with $LASTEXITCODE checked because Windows PowerShell 5.1 does not throw on native nonzero exits.
- baselineSkillInstalled requires the ownership marker as well as a regular file — the final presence predicate aligned with the rules every write path enforces, so an unmarked hand-authored baseline is refused by install AND never reported as a healthy installation. - The agent-local setup subcommands (and skill) enroll in #225's commandIgnoresLocalConfig path: they load the global config only, degrading to defaults, so a malformed repository .hey/config.json cannot stop the installer's setup agents handoff before the trust exemption is even consulted. Runtime-config commands still surface the parse error. - install.ps1 gets the same optional-setup guard install.sh got: a wizard that exits nonzero (declined OAuth, timeout, busy callback port) prints next steps instead of failing or silently swallowing a completed install, with $LASTEXITCODE checked because Windows PowerShell 5.1 does not throw on native nonzero exits.
- baselineSkillInstalled requires the ownership marker as well as a regular file — the final presence predicate aligned with the rules every write path enforces, so an unmarked hand-authored baseline is refused by install AND never reported as a healthy installation. - The agent-local setup subcommands (and skill) enroll in #225's commandIgnoresLocalConfig path: they load the global config only, degrading to defaults, so a malformed repository .hey/config.json cannot stop the installer's setup agents handoff before the trust exemption is even consulted. Runtime-config commands still surface the parse error. - install.ps1 gets the same optional-setup guard install.sh got: a wizard that exits nonzero (declined OAuth, timeout, busy callback port) prints next steps instead of failing or silently swallowing a completed install, with $LASTEXITCODE checked because Windows PowerShell 5.1 does not throw on native nonzero exits.
Second of the three-PR stack (theming #220 → this → toasts #222). Includes the docs commit: README's Omarchy section and docs/omarchy.md, the full design record.
What
hey setup omarchyinstalls hey-cli into the Omarchy desktop: aHEY TUIlauncher entry under app-idorg.omarchy.hey, aHEYrow in the SUPER+SPACE menu, an inlinehey-unreadcommand module on the bar, and ahey.toml.tpltheme template so theme authors can tune the TUI's accent overlay. Every step is idempotent, reported separately, and--removereverses them all. The keybinding is printed, never written —bindings.luastays the user's; the hint spells out the focus command because the lua helper's{ tui = ... }form would derive a non-matching app-id from a multi-word command.hey omarchy bar-status(hidden) is what the bar module runs every three minutes: a Waybar-style JSON object when the Imbox has unread mail and nothing otherwise. An indicator, not a count. Logged out, offline, or a failed account selection all print nothing and exit 0 — a bar is no place for an error message. One Imbox page decides: HEY orders postings unseen-first (boxes_controller.rborders by[:seen, observed_at desc]), so any unread mail is on page 1.Review hardening (from the bots' first pass)
shell.jsonis seeded with"version": 1— the shell ignores a version-less config entirely (shell.qmlwarns and falls back to defaults) — and an existing version-less or non-object file fails the step with a hint instead of being edited into dead config.--removerestores an initially-absent bar layout: if what remains after removing our module equals Omarchy's current default layout, the layout is dropped so the user goes back to inheriting future default changes.omarchycommand is exempt from pre-run account scoping and selects the configured account itself, treating failure as a dark indicator — preserving both scoping and the never-fails contract.hey.tomltemplate now carries the reference colors (background,blue/bright_blue,bright_foreground) the accent gate needs, since a rendered file is the only theme file the TUI reads.Summary by cubic
Installs HEY into the Omarchy desktop and adds an Imbox unread bar indicator. Old: no desktop integration. New:
hey setup omarchyinstalls aHEY TUIlauncher, a SUPER+SPACE menu row, an inlinehey-unreadbar module, and ahey.toml.tpltheme template;--removereverses.org.omarchy.hey. The bar runs every 180s viahey omarchy bar-statusand prints a Waybar-style JSON module only when unread; logged out, offline, or degraded config stays silent and exits 0.~/.config/omarchy/extensions/omarchy-menu.jsonc. Seeds~/.config/omarchy/shell.jsonwith"version": 1; refuses non-JSON or version-less files with a hint. Writes are atomic, preserve modes, and follow symlinks. Seeds the default bar layout when absent and restores it on--remove.~/.config/omarchy/themed/hey.toml.tpl; triggersomarchy-theme-refreshwhen available; templates not written byheyare kept on install/remove.o.bind(...)hint and never editsbindings.lua.~/.local/state/omarchyorOMARCHY_PATH(and an absoluteHOME); removal works without Omarchy.omarchycommands ignore repository-local config and are exempt from account scoping;setup omarchyedits fixed desktop paths only and does not use runtime config. List-only formats are refused up front. JSON errors include per-step results inMeta.steps.Required action: if
~/.config/omarchy/shell.jsonexists without"version": 1, add it before runninghey setup omarchy.Written for commit 17de3b2. Summary will update on new commits.